package com.java8.lambda;

import com.java8.lambda.dome.*;

/**
 * <p>Description: [Java8新特性:lambda表达式]</p>
 * Created on 2020/2/25
 *
 * @author <a href="mailto: 819712047@qq.com">谢振东 </a>
 * @version 1.0
 */
public class domeTest {
    /**
     * 可以把Lambda表达式理解为简洁的表示可传递的匿名函数的一种方式：
     * 它没有名称，但它有参数列表，函数主体，返回类型，可能还有一个可以抛出的异常列表。
     *
     * @param args
     */
    public static void main(String[] args) {
        // lambda表达式基础语法：
        // java中，引入了一个新的操作符“->”，该操作符在很多资料中，称为箭头操作符，
        // 或者lambda操作符；箭头操作符将lambda分成了两个部分：
        //  1.左侧：lambda表达式的参数列表
        //  2.右侧：lambda表达式中所需要执行的功能，即lambda函数体
        //  3.lambda表达式语法格式；

        //  1）.无参数，无返回值的用法 ：() -> System.out.println("hello lambda");
        test1.master();
        // 2).有一个参数，无返回值的用法： (x) -> System.out.println(x);
        // 或者 x -> System.out.println(x); 一个参数，可以省略参数的小括号
        test2.master();
        // 3）.有两个参数，有返回值的：(x, y) -> x + y
        test3.master();
        // 4）上面的例子，函数体中，都是一行语句，最后一个语法，
        // 介绍下，lambda表达式中，多行语句，分别在无返回值和有返回值的抽象类中的用法
        test4.master();
        // 5）.lambda的类型推断
        // 可以看到，在lambda中的参数列表，可以不用写参数的类型，跟java7中 new ArrayList<>();
        // 不需要指定泛型类型，这样的<>棱形操作符一样，根据上下文做类型的推断
        test5.master();

        //        lamabd表达式中，需要有函数式接口的支持；
        //        函数式接口定义：接口中只有一个抽象方法的接口，称为函数式接口；
        //        可以使用@FunctionalInterface注解修饰，对该接口做检查；
        //        如果接口里，有多个抽象方法，使用该注解，会有语法错误
        test6.master();
        // 循环
        test7.master();
        // 线程
        test8.master();
        // 复杂用例
//        test9
//        TestSort
    }
}
